﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.ServiceModel;
using System.Collections.Generic;
using MoviTiendas.Logica;
using MoviTiendas.Interfaz;
using System.Runtime.CompilerServices;
using System.Device.Location;

namespace MoviTiendas.Comunicacion
{

    [DataContract]
    public class DatosBarrios
    {

        [DataMember(Name = "NOMBRE_BARRIO")]
        public String nombre { get; set; }
    }

    [DataContract]
    public class DatosTiendas
    {

         [DataMember(Name = "NOMBRE_BARRIO")]
        public String nombreBarrio { get; set; }

        [DataMember(Name = "NOMBRE_TIENDA")]
        public String nombre { get; set; }

        [DataMember(Name = "DESCRIPCION")]
        public String descripcion { get; set; }

        [DataMember(Name = "DIRECCION")]
        public String direccion { get; set; }

        [DataMember(Name = "TELEFONO")]
        public String telefono { get; set; }

        [DataMember(Name = "HORA_ABRIR")]
        public int horaAbrir { get; set; }

        [DataMember(Name = "HORA_CERRAR")]
        public int horaCerrar { get; set; }

        [DataMember(Name = "DIAS_ABIERTO")]
        public int diasAbierto { get; set; }

        [DataMember(Name = "distance")]
        public String distancia { get; set; }
    }

    [DataContract]
    public class DatosCategoria
    {

        [DataMember(Name = "NOMBRE_TIENDA")]
        public String nombreTienda { get; set; }

        [DataMember(Name = "NOMBRE_CATEGORIA")]
        public String nombre { get; set; }
    }

    [DataContract]
    public class DatosSubcategoria
    {

        [DataMember(Name = "NOMBRE_TIENDA")]
        public String nombreTienda { get; set; }

        [DataMember(Name = "NOMBRE_SUBCATEGORIA")]
        public String nombre { get; set; }

        [DataMember(Name = "NOMBRE_CATEGORIA")]
        public String nombreCategoria { get; set; }
    }

    [DataContract]
    public class DatosItem
    {
        [DataMember(Name = "NOMBRE_TIENDA")]
        public String nombreTienda { get; set; }

        [DataMember(Name = "NOMBRE_SUBCATEGORIA")]
        public String nombreSubcategoria { get; set; }

        [DataMember(Name = "NOMBRE_PRODUCTO")]
        public String nombre { get; set; }

        [DataMember(Name = "URL_IMAGEN")]
        public String urlImagen { get; set; }

        [DataMember(Name = "PRECIO_UNITARIO")]
        public int precio { get; set; }
    }

    public class Comunicacion
    {

        private SolicitanteComunicacion solicitante;
        private int elementosRestantes;
        public List<Categoria> categorias { get; set; }
        private List<Tienda> tiendas;
        private List<SubCategoria> subcategorias;
        private List<Producto> productos;
        private String palabraClave;
        private Barrio[] barrios2;
       


        public Comunicacion(SolicitanteComunicacion sol)
        {
            this.solicitante = sol;
        }

        public  void CargarBarrios()
        {
            try
            {
                WebClient cliente = new WebClient();
                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaBarrios);
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaBarrios.php"), UriKind.Absolute);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
            }

        }

        private  void terminoLecturaBarrios(Object sender, OpenReadCompletedEventArgs e)
        {

            if (e.Error == null)
            {

                var serializador = new DataContractJsonSerializer(typeof(DatosBarrios[]));
                DatosBarrios[] ib = serializador.ReadObject(e.Result) as DatosBarrios[];
                List<Barrio> barrios = new List<Barrio>();
                for( int i = 0; i < ib.Length; i++)
                {
                   Barrio nuevo = new Barrio(ib[i].nombre);
                    barrios.Add(nuevo);
                }

                MoviTienda movi = MoviTienda.darInstancia; 
                movi.barrios = barrios;
                if (movi.cliente != null)
                {
                    Barrio barCliente = movi.cliente.barrio;

                    bool encontro = false;
                    for (int i = 0; i < barrios.Count && !encontro; i++)
                    {
                        if (barCliente.nombre.Equals(barrios[i]))
                        {
                            encontro = true;
                            movi.cliente.barrio = barrios[i];
                        }
                    }
                }
                   System.Console.WriteLine("Nombre Barrio: " + ib[0].nombre);
                   
                   //MessageBox.Show("Nombre Barrio 1: " + ib[0].nombre + "\n" + "Nombre Barrio 2: " + ib[1].nombre, "Desde la base de datos", MessageBoxButton.OK);
                   solicitante.notificarCargaDeDatos();
            }
            else
            {
                MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }

        public void CargarTiendasDeBarrios(List<Barrio> barrios)
        {
   
            elementosRestantes = barrios.Count;
            barrios2 = new Barrio[3];
            foreach (Barrio barrio in barrios)
            {
                if(barrio.nombre.Equals("Tiendas a 100 metros"))
                {
                    barrios2[0] = barrio;
                    barrios2[0].tiendas = new List<Tienda>();
                }
                else if (barrio.nombre.Equals("Tiendas a 500 metros"))
                {
                    barrios2[1] = barrio;
                    barrios2[1].tiendas = new List<Tienda>();
                
                }
                else if (barrio.nombre.Equals("Tiendas a 1000 metros"))
                {
                    //barrios2.Add(barrio);
                   
                    barrios2[2] = barrio;
                    barrios2[2].tiendas = new List<Tienda>();
                }
                else
                CargarTiendasDeBarrio(barrio);
            }

            if (barrios2[0] != null)
            {
                
                Sensores.GPS gps = new Sensores.GPS(this, barrios2[0], 0.1,false);
            }
            if (barrios2[1] != null)
            {

                Sensores.GPS gps = new Sensores.GPS(this, barrios2[1], 0.5, false);
            }
            if (barrios2[2] != null)
            {

                Sensores.GPS gps = new Sensores.GPS(this, barrios2[2], 1, false);
            }
        }


        public void buscarTiendasCercanas(Barrio barrio, double kilometros, double lat, double lon)
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaTiendas);
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaGPS.php?latitud=" + lat + "&longitud=" + lon + "&distancia=" + kilometros), UriKind.Absolute);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }

        }




        public void CargarTiendasDeBarrio(Barrio barrio)
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaTiendas);
                String parametro1 = barrio.nombre.Replace(' ', '+');
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaTiendas.php?barrio=" + parametro1), UriKind.Absolute);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }

        }

        private void terminoLecturaTiendas(Object sender, OpenReadCompletedEventArgs e)
        {

            if (e.Error == null)
            {

                var serializador = new DataContractJsonSerializer(typeof(DatosTiendas[]));
                DatosTiendas[] ib = serializador.ReadObject(e.Result) as DatosTiendas[];
                List<Tienda> tiendas = new List<Tienda>();
                for (int i = 0; i < ib.Length; i++)
                {
                    Tienda nuevo = new Tienda(ib[i].nombre, ib[i].direccion, ib[i].descripcion, ib[i].telefono, ib[i].horaAbrir, ib[i].horaCerrar, ib[i].diasAbierto);
                    tiendas.Add(nuevo);
                }
                Barrio barrio = null;

                if (ib.Length >= 1)
                {
                    if (ib[0].distancia != null)
                    {
                        for (int i = 0; i < ib.Length; i++)
                        {
                            double distancia = -1;
                            Double.TryParse(ib[i].distancia, out distancia);
                            barrio = null;
                            if (distancia < 0)
                            {
                                MessageBox.Show("Error al extraer la distancia de la consulta a la base de datos");
                            }
                            else if (distancia < 0.1)
                            {
                                if (barrios2[0] != null)
                                {
                                    barrio = barrios2[0];
                                }
                                else if (barrios2[1] != null)
                                {
                                    barrio = barrios2[1];
                                }
                                else
                                {
                                    barrio = barrios2[2];
                                }

                            }
                            else if (distancia < 0.5)
                            {

                                if (barrios2[1] != null)
                                {
                                    barrio = barrios2[1];
                                }
                                else
                                {
                                    barrio = barrios2[2];
                                }

                            }
                            else
                            {
                                barrio = barrios2[2];

                            }
                          
                                if (!barrio.tiendas.Contains(tiendas[i]))
                                {
                                    barrio.tiendas.Add(tiendas[i]);
                                }
                            
                        }
 
                    }
                    else
                    {
                        barrio = MoviTienda.darInstancia.darBarrio(ib[0].nombreBarrio); 
                        foreach (Tienda ti in tiendas)
                        {
                            if (!barrio.tiendas.Contains(ti))
                            {
                                barrio.tiendas.Add(ti);
                            }
                        }
                    }
                }

                //System.Console.WriteLine("Nombre Barrio: " + ib[0].nombre);

                //MessageBox.Show("Nombre Barrio 1: " + ib[0].nombre + "\n" + "Nombre Barrio 2: " + ib[1].nombre, "Desde la base de datos", MessageBoxButton.OK);
                disminuirElementosRestantes();
                if (elementosRestantes == 0)
                {  
                    solicitante.notificarCargaDeDatos();
                }
            }
            else
            {
                MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
            }
        }

        public void cargarCategoriasDeTiendas(List<Tienda> tiendas)
        {
           elementosRestantes = tiendas.Count;
           this.tiendas = tiendas;
           foreach (Tienda tienda in tiendas)
           {
               cargarCategoriasDeTiendas(tienda);
           }
    
        }

        private void cargarCategoriasDeTiendas(Tienda tienda)
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaCategorias);
                String parametro1 = tienda.nombre.Replace(' ', '+');
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaCategorias.php?tienda=" + parametro1), UriKind.Absolute);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }

        private void terminoLecturaCategorias(Object sender, OpenReadCompletedEventArgs e)
        {

            if (e.Error == null)
            {

                var serializador = new DataContractJsonSerializer(typeof(DatosCategoria[]));
                DatosCategoria[] ib = serializador.ReadObject(e.Result) as DatosCategoria[];
                List<Categoria> categorias = new List<Categoria>();

                if (ib.Length == 0)
                {
                    disminuirElementosRestantes();
                    return;
                }
                Tienda tienda = null;  
                bool encontro = false;
                for(int i= 0; i < tiendas.Count && !encontro; i++)
                {
                    if(tiendas[i].nombre.Equals(ib[0].nombreTienda))
                    {
                        encontro = true;
                        tienda = tiendas[i];
                    }
                }

                for (int i = 0; i < ib.Length; i++)
                {
                    Categoria nuevo = new Categoria(ib[i].nombre,tienda);
                    categorias.Add(nuevo);
                }

                tienda.categorias = categorias;
                //System.Console.WriteLine("Nombre Barrio: " + ib[0].nombre);

                //MessageBox.Show("Nombre Barrio 1: " + ib[0].nombre + "\n" + "Nombre Barrio 2: " + ib[1].nombre, "Desde la base de datos", MessageBoxButton.OK);
                disminuirElementosRestantes();

            }
            else
            {
                MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }


        public void cargarSubcategorias(List<Categoria> categorias)
        {
            elementosRestantes = categorias.Count;
           this.categorias = categorias;
           foreach (Categoria categ in categorias)
           {
               cargarSubcategoria(categ);
           }
    
        }

        private void cargarSubcategoria( Categoria categoria )
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaSubcategorias);
                String parametro1 = categoria.tienda.nombre.Replace(' ', '+');
                String parametro2 = categoria.nombre.Replace(' ', '+');
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaSubcategorias.php?tienda=" + parametro1 +"&categoria=" + parametro2), UriKind.Absolute);

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }
        private void terminoLecturaSubcategorias(Object sender, OpenReadCompletedEventArgs e)
        {

            if (e.Error == null)
            {

                var serializador = new DataContractJsonSerializer(typeof(DatosSubcategoria[]));
                DatosSubcategoria[] ib = serializador.ReadObject(e.Result) as DatosSubcategoria[];
                List<SubCategoria> subcategorias = new List<SubCategoria>();

                Categoria cate = null;  
                bool encontro = false;
                for(int i= 0; i < categorias.Count && !encontro; i++)
                {
                    if (categorias[i].tienda.nombre.Equals(ib[0].nombreTienda) && categorias[i].nombre.Equals(ib[0].nombreCategoria))
                    {
                        encontro = true;
                        cate = categorias[i];
                    }
                }

                for (int i = 0; i < ib.Length; i++)
                {
                    SubCategoria nuevo = new SubCategoria(ib[i].nombre, cate.tienda);
                    subcategorias.Add(nuevo);
                }

                cate.subcategorias = subcategorias;
                //System.Console.WriteLine("Nombre Barrio: " + ib[0].nombre);

                //MessageBox.Show("Nombre Barrio 1: " + ib[0].nombre + "\n" + "Nombre Barrio 2: " + ib[1].nombre, "Desde la base de datos", MessageBoxButton.OK);
                disminuirElementosRestantes();

            }
            else
            {
                MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }

        public void cargarItems(List<SubCategoria> subcategorias)
        {

            productos = new List<Producto>();
            tiendas = new List<Tienda>();
            this.subcategorias = subcategorias;
            elementosRestantes = subcategorias.Count;
            foreach (SubCategoria subc in subcategorias)
            {
                if(!tiendas.Contains(subc.tienda))
                {
                    tiendas.Add(subc.tienda);
                }
            }
            foreach (SubCategoria subc in subcategorias)
            {
                cargarItem(subc);
      
            }

        }

        private void cargarItem(SubCategoria subcategoria)
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaItems);
                String parametro1 = subcategoria.tienda.nombre.Replace(' ', '+');
                String parametro2 = subcategoria.nombre.Replace(' ', '+');

                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaItems.php?tienda=" + parametro1 + "&subcategoria=" + parametro2), UriKind.Absolute);

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }
        private void terminoLecturaItems(Object sender, OpenReadCompletedEventArgs e)
        {

            if (e.Error == null)
            {

                var serializador = new DataContractJsonSerializer(typeof(DatosItem[]));
                DatosItem[] ib = serializador.ReadObject(e.Result) as DatosItem[];
                List<Item> items = new List<Item>();
                bool encontro = false;
                bool encontroT = false;
                bool encontroS = false;
                Tienda ti = null;
                SubCategoria sub = null;
                Item nuevo = null;

                /*
                
                for (int i = 0; i < tiendas.Count && !encontroT; i++)
                {
                    if (tiendas[i].nombre.Equals(ib[0].nombreTienda))
                    {
                        encontroT = true;
                        ti = tiendas[i];
                    }
                }

                encontroS = false;
                for (int i = 0; i < subcategorias.Count && !encontroS; i++)
                {
                    if (subcategorias[i].nombre.Equals(ib[0].nombreSubcategoria) && subcategorias[i].tienda.Equals(ti))
                    {
                        encontroS = true;
                        sub = subcategorias[i];
                    }
                }
                */

                foreach (DatosItem datos in ib)
                {
                    // Se busca la tienda
                    for (int j = 0; j < tiendas.Count && !encontroT; j++)
                    {
                        if (tiendas[j].nombre.Equals(datos.nombreTienda))
                        {
                            encontroT = true;
                            ti = tiendas[j];
                        }
                    }

                    // Se busca la subcategoria
                    encontroS = false;
                    for (int j = 0; j < subcategorias.Count && !encontroS; j++)
                    {
                        if (subcategorias[j].nombre.Equals(datos.nombreSubcategoria) && subcategorias[j].tienda.Equals(ti))
                        {
                            encontroS = true;
                            sub = subcategorias[j];
                        }
                    }

                    //Se busca el producto
                    encontro = false;
                    for (int i = 0; i < productos.Count && !encontro; i++)
                    {
                        if (productos[i].nombre.Equals(datos.nombre))
                        {
                            encontro = true;
                            
                            nuevo = new Item(1,datos.precio,productos[i],ti);
                            productos[i].agregarItem(nuevo);
                        }
                    }

                    if (!encontro)
                    {
                        Producto prod = new Producto(datos.nombre, datos.urlImagen);
                        nuevo = new Item(1, datos.precio, prod, ti);
                        prod.agregarItem(nuevo);
                        productos.Add(prod);
                    }

                    sub.agregarItem(nuevo);
                }

                disminuirElementosRestantes();

            }
            else
            {
                MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }

        public void buscarPorPalabaraClave(List<Barrio> barrios, String palabraClave)
        {
            
            
            productos = new List<Producto>();
            tiendas = new List<Tienda>();
            this.barrios = barrios;
            this.palabraClave = palabraClave;
            CargarInternaTiendasDeBarrios(barrios);

        }

        private void iniciarCargaItemsBusqueda()
        {
                     
            foreach (Barrio bar in barrios)
            {
                foreach(Tienda tien in bar.tiendas)
                {
                    if (!tiendas.Contains(tien))
                    {
                        tiendas.Add(tien);
                    }
                }
                
            }
            elementosRestantes = tiendas.Count;
            if (tiendas.Count == 0)
            {
                solicitante.recibirResultadosBusquedaPalabraClave(new List<Producto>());
                return;
            }
            foreach (Tienda tien in tiendas)
            {
                buscarItemEnTienda(tien);
            }
        }

        private void buscarItemEnTienda(Tienda tienda)
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaBusquedaItems);
                String parametro1 = tienda.nombre.Replace(' ', '+');
                String parametro2 = palabraClave.Replace(' ', '+');

                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaItemsPalabraClave.php?tienda=" + parametro1 + "&palabra=" + parametro2), UriKind.Absolute);

            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.recibirResultadosBusquedaPalabraClave(new List<Producto>());
            }
        }


        private void terminoLecturaBusquedaItems(Object sender, OpenReadCompletedEventArgs e)
        {

        
            if(e.Error == null)
            {
                var serializador = new DataContractJsonSerializer(typeof(DatosItem[]));
                DatosItem[] ib = serializador.ReadObject(e.Result) as DatosItem[];
                List<Item> items = new List<Item>();
                bool encontro = false;
                bool encontroT = false;
                Tienda ti = null;
                Item nuevo = null;

                /*
                
                for (int i = 0; i < tiendas.Count && !encontroT; i++)
                {
                    if (tiendas[i].nombre.Equals(ib[0].nombreTienda))
                    {
                        encontroT = true;
                        ti = tiendas[i];
                    }
                }

                encontroS = false;
                for (int i = 0; i < subcategorias.Count && !encontroS; i++)
                {
                    if (subcategorias[i].nombre.Equals(ib[0].nombreSubcategoria) && subcategorias[i].tienda.Equals(ti))
                    {
                        encontroS = true;
                        sub = subcategorias[i];
                    }
                }
                */

                foreach (DatosItem datos in ib)
                {
                    // Se busca la tienda
                    for (int j = 0; j < tiendas.Count && !encontroT; j++)
                    {
                        if (tiendas[j].nombre.Equals(datos.nombreTienda))
                        {
                            encontroT = true;
                            ti = tiendas[j];
                        }
                    }

                    //Se busca el producto
                    encontro = false;
                    for (int i = 0; i < productos.Count && !encontro; i++)
                    {
                        if (productos[i].nombre.Equals(datos.nombre))
                        {
                            encontro = true;
                            
                            nuevo = new Item(1,datos.precio,productos[i],ti);
                            productos[i].agregarItem(nuevo);
                        }
                    }

                    if (!encontro)
                    {
                        Producto prod = new Producto(datos.nombre, datos.urlImagen);
                        nuevo = new Item(1, datos.precio, prod, ti);
                        prod.agregarItem(nuevo);
                        productos.Add(prod);
                    }

                }

                //System.Console.WriteLine("Nombre Barrio: " + ib[0].nombre);

                //MessageBox.Show("Nombre Barrio 1: " + ib[0].nombre + "\n" + "Nombre Barrio 2: " + ib[1].nombre, "Desde la base de datos", MessageBoxButton.OK);
                elementosRestantes--;
                if (elementosRestantes == 0)
                {
                    solicitante.recibirResultadosBusquedaPalabraClave(productos);
                }
            }
            else
            {
                MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
                solicitante.recibirResultadosBusquedaPalabraClave(new List<Producto>());
            }
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        private void disminuirElementosRestantes()
        {
            elementosRestantes--;
            if (elementosRestantes == 0)
            {
                solicitante.notificarCargaDeDatos();
            }
        }

        private void CargarInternaTiendasDeBarrios(List<Barrio> barrios)
        {

            elementosRestantes = barrios.Count;
            barrios2 = new Barrio[3];
            foreach (Barrio barrio in barrios)
            {
                if (barrio.nombre.Equals("Tiendas a 100 metros"))
                {
                    barrios2[0] = barrio;
                    barrios2[0].tiendas = new List<Tienda>();
                }
                else if (barrio.nombre.Equals("Tiendas a 500 metros"))
                {
                    barrios2[1] = barrio;
                    barrios2[1].tiendas = new List<Tienda>();

                }
                else if (barrio.nombre.Equals("Tiendas a 1000 metros"))
                {
                    //barrios2.Add(barrio);

                    barrios2[2] = barrio;
                    barrios2[2].tiendas = new List<Tienda>();
                }
                else
                    CargarInternaTiendasDeBarrio(barrio);
            }

            if (barrios2[0] != null)
            {

                Sensores.GPS gps = new Sensores.GPS(this, barrios2[0], 0.1,true);
            }
            if (barrios2[1] != null)
            {

                Sensores.GPS gps = new Sensores.GPS(this, barrios2[1], 0.5, true);
            }
            if (barrios2[2] != null)
            {

                Sensores.GPS gps = new Sensores.GPS(this, barrios2[2], 1, true);
            }
        }

        private void CargarInternaTiendasDeBarrio(Barrio barrio)
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaInternaTiendas);
                String parametro1 = barrio.nombre.Replace(' ', '+');
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaTiendas.php?barrio=" + parametro1), UriKind.Absolute);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.recibirResultadosBusquedaPalabraClave(new List<Producto>());
            }

        }

        private void terminoLecturaInternaTiendas(Object sender, OpenReadCompletedEventArgs e)
        {

            if (e.Error == null)
            {

                var serializador = new DataContractJsonSerializer(typeof(DatosTiendas[]));
                DatosTiendas[] ib = serializador.ReadObject(e.Result) as DatosTiendas[];
                List<Tienda> tiendas = new List<Tienda>();
                for (int i = 0; i < ib.Length; i++)
                {
                    Tienda nuevo = new Tienda(ib[i].nombre, ib[i].direccion, ib[i].descripcion, ib[i].telefono, ib[i].horaAbrir, ib[i].horaCerrar, ib[i].diasAbierto);
                    tiendas.Add(nuevo);
                }
                Barrio barrio = null;
                if (ib.Length >= 1)
                {
                    if (ib[0].distancia != null)
                    {
                        for (int i = 0; i < ib.Length; i++)
                        {
                            double distancia = -1;
                            Double.TryParse(ib[i].distancia, out distancia);
                            barrio = null;
                            if (distancia < 0)
                            {
                                MessageBox.Show("Error al extraer la distancia de la consulta a la base de datos");
                            }
                            else if (distancia < 0.1)
                            {
                                if (barrios2[0] != null)
                                {
                                    barrio = barrios2[0];
                                }
                                else if (barrios2[1] != null)
                                {
                                    barrio = barrios2[1];
                                }
                                else
                                {
                                    barrio = barrios2[2];
                                }

                            }
                            else if (distancia < 0.5)
                            {

                                if (barrios2[1] != null)
                                {
                                    barrio = barrios2[1];
                                }
                                else
                                {
                                    barrio = barrios2[2];
                                }

                            }
                            else
                            {
                                barrio = barrios2[2];

                            }

                            if (!barrio.tiendas.Contains(tiendas[i]))
                            {
                                barrio.tiendas.Add(tiendas[i]);
                            }

                        }

                    }
                    else
                    {
                        barrio = MoviTienda.darInstancia.darBarrio(ib[0].nombreBarrio);
                        foreach (Tienda ti in tiendas)
                        {
                            if (!barrio.tiendas.Contains(ti))
                            {
                                barrio.tiendas.Add(ti);
                            }
                        }
                    }
                }
              

                //System.Console.WriteLine("Nombre Barrio: " + ib[0].nombre);

                //MessageBox.Show("Nombre Barrio 1: " + ib[0].nombre + "\n" + "Nombre Barrio 2: " + ib[1].nombre, "Desde la base de datos", MessageBoxButton.OK);
                elementosRestantes--;
                if (elementosRestantes == 0)
                {
                   iniciarCargaItemsBusqueda();
                }
            }
            else
            {
                MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
                solicitante.recibirResultadosBusquedaPalabraClave(new List<Producto>());
            }
        }

        public List<Barrio> barrios { get; set; }

        internal void buscarCodigoDeBarras(string codigo)
        {
            try
            {
                WebClient cliente = new WebClient();


                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaCodigoBarras);
                String parametro1 = codigo.Replace(' ', '+');
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaCodigo.php?codigo=" + parametro1), UriKind.Absolute);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }

        private void terminoLecturaCodigoBarras(Object sender, OpenReadCompletedEventArgs e)
        {
              if (e.Error == null)
            {
                var serializador = new DataContractJsonSerializer(typeof(DatosItem[]));
                DatosItem[] ib = serializador.ReadObject(e.Result) as DatosItem[];

                if (ib.Length > 0)
                {
                    PaginaPrincipal pag = (PaginaPrincipal)solicitante;
                    pag.actualizarPalabraBusqueda(ib[0].nombre);

                }
                else
                {
                    PaginaPrincipal pag = (PaginaPrincipal)solicitante;
                    pag.actualizarPalabraBusqueda(null);
                }
            }
            else
            {       
                  MessageBox.Show("Error en la conexión", "Error", MessageBoxButton.OK);
                  
                  solicitante.recibirResultadosBusquedaPalabraClave(new List<Producto>());
            }

        }



        internal void buscarInternaTiendasCercanas(Barrio barrio, double kilometros, double lat, double lon)
        {
            try
            {
                WebClient cliente = new WebClient();

                cliente.OpenReadCompleted += new OpenReadCompletedEventHandler(terminoLecturaInternaTiendas);
                cliente.OpenReadAsync(new Uri("http://francoal.com.co/consultaGPS.php?latitud=" + lat + "&longitud=" + lon + "&distancia=" + kilometros), UriKind.Absolute);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButton.OK);
                solicitante.notificarCargaDeDatos();
            }
        }
    }
 
    
  }

